//package com.perfma.xtest.tool.word;
//
//import com.deepoove.poi.data.CellRenderData;
//import com.deepoove.poi.data.MiniTableRenderData;
//import com.deepoove.poi.data.RowRenderData;
//import com.deepoove.poi.data.TextRenderData;
//import com.deepoove.poi.data.style.TableStyle;
//import com.deepoove.poi.policy.MiniTableRenderPolicy;
//import com.deepoove.poi.policy.TextRenderPolicy;
//import com.deepoove.poi.render.RenderContext;
//import com.deepoove.poi.util.StyleUtils;
//import com.deepoove.poi.util.TableTools;
//import com.deepoove.poi.xwpf.BodyContainer;
//import com.deepoove.poi.xwpf.BodyContainerFactory;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.xwpf.usermodel.*;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
//
//import java.util.List;
//import java.util.Objects;
//
///**
// * 自定义的表格处理插件
// * 主要用于实现项目报告的合并单元格。由于合并逻辑是硬编码，所以此插件不具备通用性。
// * 此插件基于MiniTableRenderPolicy，在此基础上增加了合并单元格的逻辑（由于创建表格后外部无法重新拿到XWPFTable，所以只能重写整个MiniTableRenderPolicy）
// *
// * @author: junhui.si
// * @date: 2020-11-17 16:42
// **/
//public class PlanReportTableRenderPolicy extends MiniTableRenderPolicy {
//    /**
//     * 合并单元格的标志
//     */
//    private static final String MERGE_KEY = "";
//
//    @Override
//    protected boolean validate(MiniTableRenderData data) {
//        return (null != data && (data.isSetBody() || data.isSetHeader()));
//    }
//
//    @Override
//    public void doRender(RenderContext<MiniTableRenderData> context) throws Exception {
//        Helper.renderMiniTable(context.getRun(), context.getData());
//    }
//
//    @Override
//    protected void afterRender(RenderContext<MiniTableRenderData> context) {
//        clearPlaceholder(context, true);
//    }
//
//    public static class Helper {
//
//        public static void renderMiniTable(XWPFRun run, MiniTableRenderData data) {
//            if (data.isSetBody()) {
//                renderTable(run, data);
//            } else {
//                renderNoDataTable(run, data);
//            }
//        }
//
//        public static void renderTable(XWPFRun run, MiniTableRenderData tableData) {
//            // 1.计算行和列
//            int row = tableData.getRows().size(), col = 0;
//            if (!tableData.isSetHeader()) {
//                col = getMaxColumFromData(tableData.getRows());
//            } else {
//                row++;
//                col = tableData.getHeader().size();
//            }
//
//            // 2.创建表格
//            BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
//            XWPFTable table = bodyContainer.insertNewTable(run, row, col);
//            TableTools.initBasicTable(table, col, tableData.getWidth(), tableData.getStyle());
//
//            // 3.渲染数据
//            int startRow = 0;
//            if (tableData.isSetHeader()) {
//                Helper.renderRow(table, startRow++, tableData.getHeader());
//            }
//            for (RowRenderData data : tableData.getRows()) {
//                Helper.renderRow(table, startRow++, data);
//            }
//
//            // 4.合并单元格
//            mergeCell(tableData, table);
//
//            // 5.设置单元格垂直居中
//            for (XWPFTableRow xwpfTableRow : table.getRows()) {
//                for (XWPFTableCell cell : xwpfTableRow.getTableCells()) {
//                    // 设置cell垂直居中
//                    CTTc ctTc = cell.getCTTc();
//                    CTTcPr tcPr = ctTc.isSetTcPr() ? ctTc.getTcPr() : ctTc.addNewTcPr();
//                    CTVerticalJc vAlign = tcPr.isSetVAlign() ? tcPr.getVAlign() : tcPr.addNewVAlign();
//                    vAlign.setVal(STVerticalJc.CENTER);
//                }
//            }
//        }
//
//        public static void renderNoDataTable(XWPFRun run, MiniTableRenderData tableData) {
//            int row = 2, col = tableData.getHeader().size();
//            BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
//            XWPFTable table = bodyContainer.insertNewTable(run, row, col);
//            TableTools.initBasicTable(table, col, tableData.getWidth(), tableData.getStyle());
//
//            Helper.renderRow(table, 0, tableData.getHeader());
//
//            TableTools.mergeCellsHorizonal(table, 1, 0, col - 1);
//            XWPFTableCell cell = table.getRow(1).getCell(0);
//            cell.setText(tableData.getNoDatadesc());
//        }
//
//        public static void renderRow(XWPFTable table, int row, RowRenderData rowData) {
//            if (null == rowData || rowData.size() <= 0) {
//                return;
//            }
//            XWPFTableRow tableRow = table.getRow(row);
//            Objects.requireNonNull(tableRow, "Row [" + row + "] do not exist in the table");
//
//            TableStyle rowStyle = rowData.getRowStyle();
//            List<CellRenderData> cellDatas = rowData.getCells();
//            XWPFTableCell cell = null;
//
//            for (int i = 0; i < cellDatas.size(); i++) {
//                cell = tableRow.getCell(i);
//                Objects.requireNonNull(cell, "Cell [" + i + "] do not exist at row " + row);
//                renderCell(cell, cellDatas.get(i), rowStyle);
//            }
//        }
//
//        public static void renderCell(XWPFTableCell cell, CellRenderData cellData, TableStyle rowStyle) {
//            TableStyle cellStyle = (null == cellData.getCellStyle() ? rowStyle : cellData.getCellStyle());
//            if (null != cellStyle && null != cellStyle.getBackgroundColor()) {
//                cell.setColor(cellStyle.getBackgroundColor());
//            }
//
//            TextRenderData renderData = cellData.getCellText();
//            if (StringUtils.isBlank(renderData.getText())) {
//                return;
//            }
//
//            CTTc ctTc = cell.getCTTc();
//            CTP ctP = (ctTc.sizeOfPArray() == 0) ? ctTc.addNewP() : ctTc.getPArray(0);
//            XWPFParagraph par = new XWPFParagraph(ctP, cell);
//            StyleUtils.styleTableParagraph(par, cellStyle);
//
//            TextRenderPolicy.Helper.renderTextRun(par.createRun(), renderData);
//        }
//
//        private static int getMaxColumFromData(List<RowRenderData> datas) {
//            int maxColom = 0;
//            for (RowRenderData obj : datas) {
//                if (null == obj) {
//                    continue;
//                }
//                if (obj.size() > maxColom) {
//                    maxColom = obj.size();
//                }
//            }
//            return maxColom;
//        }
//
//        /**
//         * 合并单元格的规则
//         * 一列中可能包含多个合并单元格
//         *
//         * @param tableData 表格数据
//         * @param table     表格
//         * @return 合并单元格的规则
//         */
//        private static void mergeCell(MiniTableRenderData tableData, XWPFTable table) {
//            // 列数
//            int cellSize = tableData.getHeader().getCells().size();
//            for (int cellIndex = 0; cellIndex < cellSize; cellIndex++) {
//                List<RowRenderData> rowRenderDataList = tableData.getRows();
//                // 上一个有值的索引
//                int rowIndexOfHasValue = 0;
//
//                for (int rowIndex = 0; rowIndex < rowRenderDataList.size(); rowIndex++) {
//                    RowRenderData rowRenderData = rowRenderDataList.get(rowIndex);
//                    List<CellRenderData> cells = rowRenderData.getCells();
//                    // 若此行没有cellIndex列，则不计算
//                    if (cells.size() < cellIndex) {
//                        continue;
//                    }
//
//                    // rowIndex行，cellIndex列的单元格
//                    CellRenderData cellRenderData = cells.get(cellIndex);
//                    String value = cellRenderData.getCellText().getText();
//
//                    // 是否有值
//                    boolean hasValueCell = value != null && !value.isEmpty() || rowIndex == rowRenderDataList.size() - 1;
//                    // 是否为最后一个,并且无值
//                    boolean isLastCellAndNoValue = rowIndex == rowRenderDataList.size() - 1 && MERGE_KEY.equals(value);
//                    if (hasValueCell || isLastCellAndNoValue) {
//                        rowIndex = isLastCellAndNoValue ? ++rowIndex : rowIndex;
//
//                        // 若有值的index之间的间距大于1，则说明中间有空格，则上一个有值的地方需要合并
//                        if (rowIndex - rowIndexOfHasValue > 1) {
//                            // 合并一次
//                            TableTools.mergeCellsVertically(table, cellIndex, rowIndexOfHasValue + 1, rowIndex);
//                        }
//                        rowIndexOfHasValue = rowIndex;
//                    }
//                }
//            }
//        }
//    }
//}
